import torchvision
import torchvision.transforms.functional as TF
import numpy as np
from PIL import Image

#此函数接受两个参数：输入图像img和参考图像ref
def horizontal_flip(img , ref):
    #返回值是经水平翻转处理后的img和ref
    return TF.hflip(img), TF.hflip(ref)

#此函数接受两个参数：输入图像img和参考图像ref
def vertical_flip(img, ref):
    #返回值是经垂直翻转处理后的img和ref
    return TF.vflip(img), TF.vflip(ref)

#此函数接受三个参数：输入图像img、参考图像ref和裁剪尺寸crop_size
def random_crop(img, ref, crop_size):
    #assert确保crop_size小于img的宽和高（确保裁剪尺寸不会超过图像的尺寸）
    assert crop_size <= img.width and crop_size <= img.height
    #计算最大的裁剪范围（表示左边界和上边界的最大偏移量，可在此范围内进行裁剪）
    max_left = img.height - crop_size
    max_top = img.width - crop_size
    #用于指定裁剪位置的 left 和 top 变量被初始化为 0
    left = 0
    top = 0
    #如果max_left或max_top大于0，则在[0, max_left]和[0, max_top]范围内随机选择一个整数作为裁剪的顶部边界和左边界
    if max_left > 0:
        left = np.random.randint(low=0, high=max_left, size=1)[0]
    if max_top > 0:
        top = np.random.randint(low=0, high=max_top, size=1)[0]
    #调用 TF.crop 函数并传入输入图像、左边界、上边界和裁剪尺寸作为参数，将结果存储到 img_crop 和 ref_crop 变量中
    #以（left, top）为左上角的起始点，裁剪出crop_size * crop_size大小的图像
    img_crop = TF.crop(img, left, top, crop_size, crop_size)
    ref_crop = TF.crop(ref, left, top, crop_size, crop_size)
    #返回值是经随机裁剪处理后的img和ref
    return img_crop, ref_crop

#当作为独立程序运行时，会执行此部分代码
if __name__ == "__main__":
    #使用 Image.open 函数打开一个输入图像 (img) 和一个参考图像 (ref)
    #img = Image.open("E:/GAN/Example/python_FCN/human_dataset/train_human/00001.png")
    #ref = Image.open("E:/GAN/Example/python_FCN/human_dataset/train_mask/00001_matte.png")
    #调用 random_crop 函数并传入输入图像和 img.height - 1 作为裁剪尺寸，但没有将结果存储到变量中
    #random_crop(img, ref, img.height - 1)

    #打印 torchvision.transforms.functional 模块中 TF.crop 函数的帮助文档
    print(help(TF.crop))